home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Emulators / v2600 / Source.lha / Source / cpu.h < prev    next >
C/C++ Source or Header  |  1997-04-24  |  4KB  |  185 lines

  1. /*****************************************************************************
  2.  
  3.    This file is part of x2600, the Atari 2600 Emulator
  4.    ===================================================
  5.    
  6.    Copyright 1996 Alex Hornby. For contributions see the file CREDITS.
  7.  
  8.    This software is distributed under the terms of the GNU General Public
  9.    License. This is free software with ABSOLUTELY NO WARRANTY.
  10.    
  11.    See the file COPYING for details.
  12.  
  13.    Tweaked by Matthew Stroup for Amiga v2600, April 10, 1997.
  14.    
  15. ******************************************************************************/
  16. /*
  17.  *
  18.  * This file was part of x64.
  19.  *
  20.  * This file contains useful stuff when you are creating
  21.  * virtual machine like MCS6510 based microcomputer.
  22.  *
  23.  * Included are:
  24.  *    o registers
  25.  *    o flags in PSW
  26.  *      o addressing modes
  27.  *
  28.  * Written by
  29.  *   Vesa-Matti Puro (vmp@lut.fi)
  30.  *   Jarkko Sonninen (sonninen@lut.fi)
  31.  *   Jouko Valta (jopi@stekt.oulu.fi)
  32.  *
  33.  *
  34.  */
  35.  
  36. #ifndef X2600_CPU_H
  37. #define X2600_CPU_H
  38.  
  39.  
  40. #include "config.h"
  41. #include "types.h"
  42.  
  43. /* Initialise the CPU */
  44. void init_cpu(ADDRESS addr);
  45.  
  46. /* 6507 Registers. */
  47. #define AC        accumulator
  48. #define XR        x_register
  49. #define YR        y_register
  50. #define SP        stack_pointer
  51. #define PC        program_counter
  52. #define PCH        ((PC>>8)&0xff)
  53. #define PCL        (PC&0xff)
  54.  
  55. #define ZF        zero_flag
  56. #define SF        sign_flag
  57. #define OF        overflow_flag
  58. #define BF        break_flag
  59. #define DF        decimal_flag
  60. #define IF        interrupt_flag
  61. #define CF        carry_flag
  62.  
  63.  
  64. /* Masks which indicate location of status flags in PSW. */
  65. #define S_SIGN        0x80
  66. #define S_OVERFLOW    0x40
  67. #define S_NOTUSED     0x20
  68. #define S_BREAK        0x10
  69. #define S_DECIMAL    0x08
  70. #define S_INTERRUPT    0x04
  71. #define S_ZERO        0x02
  72. #define S_CARRY        0x01
  73.  
  74.  
  75. /* ADDRESSING MODES */
  76.  
  77. #define IMPLIED        0
  78. #define ACCUMULATOR    1
  79. #define IMMEDIATE    2
  80.  
  81. #define ZERO_PAGE    3
  82. #define ZERO_PAGE_X    4
  83. #define ZERO_PAGE_Y    5
  84.  
  85. #define ABSOLUTE    6
  86. #define ABSOLUTE_X    7
  87. #define ABSOLUTE_Y    8
  88.  
  89. #define ABS_INDIRECT    9
  90. #define INDIRECT_X    10
  91. #define INDIRECT_Y    11
  92.  
  93. #define RELATIVE    12
  94.  
  95. #define ASS_CODE    13
  96.  
  97.  
  98. /*
  99.  * Declaration for lookup-table which is used to translate MOS6502
  100.  * machine instructions. Machine code is used as index to array called
  101.  * lookup. Pointer to function is then fetched from array and function
  102.  * is called.
  103.  */
  104.  
  105. extern struct lookup_tag {
  106.     char          *mnemonic;    /* Selfdocumenting? */
  107.     short          addr_mode;
  108.     unsigned char  source;
  109.     unsigned char  destination;
  110.     unsigned char  cycles;
  111.     unsigned char  pbc_fix;    /* Cycle for Page Boundary Crossing */
  112. }       lookup[];
  113.  
  114.  
  115. /* Addressing mode (addr_mode) is used when instruction is diassembled
  116.  * or assembled by diassembler or assembler. This is used i.e.
  117.  * in function char *sprint_opcode() in the file misc.c.
  118.  *
  119.  * MOS6502 addressing modes are #defined in the file "vmachine.h".
  120.  *
  121.  * Mnemonic is character string telling the name of the instruction.
  122.  */
  123.  
  124. #define M_NONE    0
  125. #define M_AC     1
  126. #define M_XR    2
  127. #define M_YR    3
  128. #define M_SP    4
  129. #define M_SR    5
  130. #define M_PC    6
  131. #define M_IMM    7
  132. #define M_ZERO    8
  133. #define M_ZERX    9
  134. #define M_ZERY    10
  135. #define M_ABS    11
  136. #define M_ABSX    12
  137. #define M_ABSY    13
  138. #define M_AIND    14
  139. #define M_INDX    15
  140. #define M_INDY    16
  141. #define M_REL    17
  142. #define M_FC    18
  143. #define M_FD    19
  144. #define M_FI    20
  145. #define M_FV    21
  146. #define M_ADDR    22
  147. #define M_    23
  148.  
  149. #ifndef NO_UNDOC_CMDS
  150. #define M_ACIM    24    /* Source: AC & IMMED (bus collision) */
  151. #define M_ANXR    25    /* Source: AC & XR (bus collision) */
  152. #define M_AXIM    26    /* Source: (AC | #EE) & XR & IMMED (bus collision) */
  153. #define M_ACNC    27    /* Dest: M_AC and Carry = Negative */
  154. #define M_ACXR    28    /* Dest: M_AC, M_XR */
  155.  
  156. #define M_SABY    29    /* Source: (ABS_Y & SP) (bus collision) */
  157. #define M_ACXS    30    /* Dest: M_AC, M_XR, M_SP */
  158. #define M_STH0    31    /* Dest: Store (src & Addr_Hi+1) to (Addr +0x100) */
  159. #define M_STH1    32
  160. #define M_STH2    33
  161. #define M_STH3    34
  162.  
  163. #else
  164. #define M_ACIM    M_NONE
  165. #define M_ANXR    M_NONE
  166. #define M_AXIM    M_NONE
  167. #define M_ACNC    M_NONE
  168. #define M_ACXR    M_NONE
  169.  
  170. #define M_SABY    M_NONE
  171. #define M_ACXS    M_NONE
  172. #define M_STH0    M_NONE
  173. #define M_STH1    M_NONE
  174. #define M_STH2    M_NONE
  175. #define M_STH3    M_NONE
  176. #endif
  177.  
  178. __inline ADDRESS load_abs_addr(void);
  179. __inline int pagetest( ADDRESS a, UBYTE b);
  180. __inline int brtest( UBYTE a);
  181. __inline int toBCD( int a);
  182. __inline int fromBCD( int a);
  183.  
  184. #endif  /* X2600_CPU_H */
  185.